package genetica.cromosomas.evaluadores;

import genetica.cromosomas.fenotipos.Fenotipo;
import genetica.cromosomas.fenotipos.FenotipoPG;
import genetica.cromosomas.fenotipos.fenotipoPG.Koza;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class EvaluadorPG extends Evaluador {

	static ArrayList<Koza> kozas = new ArrayList<Koza>();
	static {
		BufferedReader br = null;

		// Apertura del fichero y creacion de BufferedReader para poder
		// hacer una lectura comoda (disponer del metodo readLine()).
		InputStream is = EvaluadorPG.class.getResourceAsStream("kozas.txt");
		InputStreamReader isr = new InputStreamReader(is);
		br = new BufferedReader(isr);
		String cadena;
		try {
			while ((cadena = br.readLine()) != null) {
				Koza koza = new Koza();
				// System.out.println(cadena);
				StringTokenizer stk = new StringTokenizer(cadena, "*");
				while (stk.hasMoreElements()) {
					String o = (String) stk.nextElement();
					for (int i = 0; i < o.length(); i++) 
						koza.addToMesa(o.charAt(i));
					
					if (stk.hasMoreElements()) {
						o = (String) stk.nextElement();
						for (int i = 0; i < o.length(); i++) 
							koza.addToPila(o.charAt(i));
					}
				}
				kozas.add(koza);
			}
		} catch (IOException e) {
			e.printStackTrace();
			throw new Error("Error de I/O en la lectura");
		}
	}

	@Override
	public Double evalua(ArrayList<Fenotipo> fenotipo) {
		if (!(fenotipo.size() != 1) || !(fenotipo.get(0) instanceof FenotipoPG)) {
			Double solucionesCorrectas = 1.0;
			FenotipoPG fen = (FenotipoPG) fenotipo.get(0);
			for (Koza koza : kozas) {
				Koza temp_ = koza.clone();
				fen.getArbol().evalua(temp_);
				if (temp_.solucion())
					solucionesCorrectas += 1;

			}
			return solucionesCorrectas;
		}
		throw new Error("fenotipo incorrecto");
		// TODO Auto-generated method stub
	}

}
